home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / lib / python2.6 / webbrowser.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-11-11  |  19KB  |  671 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. '''Interfaces for launching and remotely controlling Web browsers.'''
  5. import os
  6. import shlex
  7. import sys
  8. import stat
  9. import subprocess
  10. import time
  11. __all__ = [
  12.     'Error',
  13.     'open',
  14.     'open_new',
  15.     'open_new_tab',
  16.     'get',
  17.     'register']
  18.  
  19. class Error(Exception):
  20.     pass
  21.  
  22. _browsers = { }
  23. _tryorder = []
  24.  
  25. def register(name, klass, instance = None, update_tryorder = 1):
  26.     '''Register a browser connector and, optionally, connection.'''
  27.     _browsers[name.lower()] = [
  28.         klass,
  29.         instance]
  30.     if update_tryorder > 0:
  31.         _tryorder.append(name)
  32.     elif update_tryorder < 0:
  33.         _tryorder.insert(0, name)
  34.     
  35.  
  36.  
  37. def get(using = None):
  38.     '''Return a browser launcher instance appropriate for the environment.'''
  39.     if using is not None:
  40.         alternatives = [
  41.             using]
  42.     else:
  43.         alternatives = _tryorder
  44.     for browser in alternatives:
  45.         if '%s' in browser:
  46.             browser = shlex.split(browser)
  47.             if browser[-1] == '&':
  48.                 return BackgroundBrowser(browser[:-1])
  49.             return GenericBrowser(browser)
  50.         '%s' in browser
  51.         
  52.         try:
  53.             command = _browsers[browser.lower()]
  54.         except KeyError:
  55.             command = _synthesize(browser)
  56.  
  57.         if command[1] is not None:
  58.             return command[1]
  59.         if command[0] is not None:
  60.             return command[0]()
  61.     
  62.     raise Error('could not locate runnable browser')
  63.  
  64.  
  65. def open(url, new = 0, autoraise = 1):
  66.     for name in _tryorder:
  67.         browser = get(name)
  68.         if browser.open(url, new, autoraise):
  69.             return True
  70.     
  71.     return False
  72.  
  73.  
  74. def open_new(url):
  75.     return open(url, 1)
  76.  
  77.  
  78. def open_new_tab(url):
  79.     return open(url, 2)
  80.  
  81.  
  82. def _synthesize(browser, update_tryorder = 1):
  83.     """Attempt to synthesize a controller base on existing controllers.
  84.  
  85.     This is useful to create a controller when a user specifies a path to
  86.     an entry in the BROWSER environment variable -- we can copy a general
  87.     controller to operate using a specific installation of the desired
  88.     browser in this way.
  89.  
  90.     If we can't create a controller in this way, or if there is no
  91.     executable for the requested browser, return [None, None].
  92.  
  93.     """
  94.     cmd = browser.split()[0]
  95.     if not _iscommand(cmd):
  96.         return [
  97.             None,
  98.             None]
  99.     name = os.path.basename(cmd)
  100.     
  101.     try:
  102.         command = _browsers[name.lower()]
  103.     except KeyError:
  104.         _iscommand(cmd)
  105.         _iscommand(cmd)
  106.         return [
  107.             None,
  108.             None]
  109.  
  110.     controller = command[1]
  111.     if controller and name.lower() == controller.basename:
  112.         import copy as copy
  113.         controller = copy.copy(controller)
  114.         controller.name = browser
  115.         controller.basename = os.path.basename(browser)
  116.         register(browser, None, controller, update_tryorder)
  117.         return [
  118.             None,
  119.             controller]
  120.     return [
  121.         None,
  122.         None]
  123.  
  124. if sys.platform[:3] == 'win':
  125.     
  126.     def _isexecutable(cmd):
  127.         cmd = cmd.lower()
  128.         if os.path.isfile(cmd) and cmd.endswith(('.exe', '.bat')):
  129.             return True
  130.         for ext in ('.exe', '.bat'):
  131.             if os.path.isfile(cmd + ext):
  132.                 return True
  133.         
  134.         return False
  135.  
  136. else:
  137.     
  138.     def _isexecutable(cmd):
  139.         if os.path.isfile(cmd):
  140.             mode = os.stat(cmd)[stat.ST_MODE]
  141.             if mode & stat.S_IXUSR and mode & stat.S_IXGRP or mode & stat.S_IXOTH:
  142.                 return True
  143.         
  144.         return False
  145.  
  146.  
  147. def _iscommand(cmd):
  148.     '''Return True if cmd is executable or can be found on the executable
  149.     search path.'''
  150.     if _isexecutable(cmd):
  151.         return True
  152.     path = os.environ.get('PATH')
  153.     if not path:
  154.         return False
  155.     for d in path.split(os.pathsep):
  156.         exe = os.path.join(d, cmd)
  157.         if _isexecutable(exe):
  158.             return True
  159.     
  160.     return False
  161.  
  162.  
  163. class BaseBrowser(object):
  164.     '''Parent class for all browsers. Do not use directly.'''
  165.     args = [
  166.         '%s']
  167.     
  168.     def __init__(self, name = ''):
  169.         self.name = name
  170.         self.basename = name
  171.  
  172.     
  173.     def open(self, url, new = 0, autoraise = 1):
  174.         raise NotImplementedError
  175.  
  176.     
  177.     def open_new(self, url):
  178.         return self.open(url, 1)
  179.  
  180.     
  181.     def open_new_tab(self, url):
  182.         return self.open(url, 2)
  183.  
  184.  
  185.  
  186. class GenericBrowser(BaseBrowser):
  187.     '''Class for all browsers started with a command
  188.        and without remote functionality.'''
  189.     
  190.     def __init__(self, name):
  191.         if isinstance(name, basestring):
  192.             self.name = name
  193.             self.args = [
  194.                 '%s']
  195.         else:
  196.             self.name = name[0]
  197.             self.args = name[1:]
  198.         self.basename = os.path.basename(self.name)
  199.  
  200.     
  201.     def open(self, url, new = 0, autoraise = 1):
  202.         cmdline = [] + [ arg.replace('%s', url) for arg in self.args ]
  203.         
  204.         try:
  205.             return not p.wait()
  206.         except OSError:
  207.             []
  208.             []
  209.             [
  210.                 self.name]
  211.             return False
  212.  
  213.  
  214.  
  215.  
  216. class BackgroundBrowser(GenericBrowser):
  217.     '''Class for all browsers which are to be started in the
  218.        background.'''
  219.     
  220.     def open(self, url, new = 0, autoraise = 1):
  221.         cmdline = [] + [ arg.replace('%s', url) for arg in self.args ]
  222.         
  223.         try:
  224.             if sys.platform[:3] == 'win':
  225.                 p = subprocess.Popen(cmdline)
  226.             else:
  227.                 setsid = getattr(os, 'setsid', None)
  228.                 if not setsid:
  229.                     setsid = getattr(os, 'setpgrp', None)
  230.                 
  231.                 p = subprocess.Popen(cmdline, close_fds = True, preexec_fn = setsid)
  232.             return p.poll() is None
  233.         except OSError:
  234.             []
  235.             []
  236.             [
  237.                 self.name]
  238.             return False
  239.  
  240.  
  241.  
  242.  
  243. class UnixBrowser(BaseBrowser):
  244.     '''Parent class for all Unix browsers with remote functionality.'''
  245.     raise_opts = None
  246.     remote_args = [
  247.         '%action',
  248.         '%s']
  249.     remote_action = None
  250.     remote_action_newwin = None
  251.     remote_action_newtab = None
  252.     background = False
  253.     redirect_stdout = True
  254.     
  255.     def _invoke(self, args, remote, autoraise):
  256.         raise_opt = []
  257.         if remote and self.raise_opts:
  258.             autoraise = int(bool(autoraise))
  259.             opt = self.raise_opts[autoraise]
  260.             if opt:
  261.                 raise_opt = [
  262.                     opt]
  263.             
  264.         
  265.         cmdline = [
  266.             self.name] + raise_opt + args
  267.         if remote or self.background:
  268.             inout = file(os.devnull, 'r+')
  269.         else:
  270.             inout = None
  271.         setsid = getattr(os, 'setsid', None)
  272.         if not setsid:
  273.             setsid = getattr(os, 'setpgrp', None)
  274.         
  275.         if not self.redirect_stdout or inout:
  276.             pass
  277.         p = subprocess.Popen(cmdline, close_fds = True, stdin = inout, stdout = None, stderr = inout, preexec_fn = setsid)
  278.         if remote:
  279.             time.sleep(1)
  280.             rc = p.poll()
  281.             if rc is None:
  282.                 time.sleep(4)
  283.                 rc = p.poll()
  284.                 if rc is None:
  285.                     return True
  286.             
  287.             return not rc
  288.         if self.background:
  289.             if p.poll() is None:
  290.                 return True
  291.             return False
  292.         self.background
  293.         return not p.wait()
  294.  
  295.     
  296.     def open(self, url, new = 0, autoraise = 1):
  297.         if new == 0:
  298.             action = self.remote_action
  299.         elif new == 1:
  300.             action = self.remote_action_newwin
  301.         elif new == 2:
  302.             if self.remote_action_newtab is None:
  303.                 action = self.remote_action_newwin
  304.             else:
  305.                 action = self.remote_action_newtab
  306.         else:
  307.             raise Error("Bad 'new' parameter to open(); " + 'expected 0, 1, or 2, got %s' % new)
  308.         args = [ arg.replace('%s', url).replace('%action', action) for arg in self.remote_args ]
  309.         success = self._invoke(args, True, autoraise)
  310.         if not success:
  311.             args = [ arg.replace('%s', url) for arg in self.args ]
  312.             return self._invoke(args, False, False)
  313.         return True
  314.  
  315.  
  316.  
  317. class Mozilla(UnixBrowser):
  318.     '''Launcher class for Mozilla/Netscape browsers.'''
  319.     raise_opts = [
  320.         '-noraise',
  321.         '-raise']
  322.     remote_args = [
  323.         '-remote',
  324.         'openURL(%s%action)']
  325.     remote_action = ''
  326.     remote_action_newwin = ',new-window'
  327.     remote_action_newtab = ',new-tab'
  328.     background = True
  329.  
  330. Netscape = Mozilla
  331.  
  332. class Galeon(UnixBrowser):
  333.     '''Launcher class for Galeon/Epiphany browsers.'''
  334.     raise_opts = [
  335.         '-noraise',
  336.         '']
  337.     remote_args = [
  338.         '%action',
  339.         '%s']
  340.     remote_action = '-n'
  341.     remote_action_newwin = '-w'
  342.     background = True
  343.  
  344.  
  345. class Opera(UnixBrowser):
  346.     '''Launcher class for Opera browser.'''
  347.     raise_opts = [
  348.         '',
  349.         '-raise']
  350.     remote_args = [
  351.         '-remote',
  352.         'openURL(%s%action)']
  353.     remote_action = ''
  354.     remote_action_newwin = ',new-window'
  355.     remote_action_newtab = ',new-page'
  356.     background = True
  357.  
  358.  
  359. class Elinks(UnixBrowser):
  360.     '''Launcher class for Elinks browsers.'''
  361.     remote_args = [
  362.         '-remote',
  363.         'openURL(%s%action)']
  364.     remote_action = ''
  365.     remote_action_newwin = ',new-window'
  366.     remote_action_newtab = ',new-tab'
  367.     background = False
  368.     redirect_stdout = False
  369.  
  370.  
  371. class Konqueror(BaseBrowser):
  372.     '''Controller for the KDE File Manager (kfm, or Konqueror).
  373.  
  374.     See the output of ``kfmclient --commands``
  375.     for more information on the Konqueror remote-control interface.
  376.     '''
  377.     
  378.     def open(self, url, new = 0, autoraise = 1):
  379.         if new == 2:
  380.             action = 'newTab'
  381.         else:
  382.             action = 'openURL'
  383.         devnull = file(os.devnull, 'r+')
  384.         setsid = getattr(os, 'setsid', None)
  385.         if not setsid:
  386.             setsid = getattr(os, 'setpgrp', None)
  387.         
  388.         
  389.         try:
  390.             p = subprocess.Popen([
  391.                 'kfmclient',
  392.                 action,
  393.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull)
  394.         except OSError:
  395.             pass
  396.  
  397.         p.wait()
  398.         return True
  399.         
  400.         try:
  401.             p = subprocess.Popen([
  402.                 'konqueror',
  403.                 '--silent',
  404.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull, preexec_fn = setsid)
  405.         except OSError:
  406.             pass
  407.  
  408.         if p.poll() is None:
  409.             return True
  410.         
  411.         try:
  412.             p = subprocess.Popen([
  413.                 'kfm',
  414.                 '-d',
  415.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull, preexec_fn = setsid)
  416.         except OSError:
  417.             p.poll() is None
  418.             p.poll() is None
  419.             return False
  420.  
  421.         return p.poll() is None
  422.  
  423.  
  424.  
  425. class Grail(BaseBrowser):
  426.     
  427.     def _find_grail_rc(self):
  428.         import glob as glob
  429.         import pwd as pwd
  430.         import socket as socket
  431.         import tempfile as tempfile
  432.         tempdir = os.path.join(tempfile.gettempdir(), '.grail-unix')
  433.         user = pwd.getpwuid(os.getuid())[0]
  434.         filename = os.path.join(tempdir, user + '-*')
  435.         maybes = glob.glob(filename)
  436.         if not maybes:
  437.             return None
  438.         s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  439.         for fn in maybes:
  440.             
  441.             try:
  442.                 s.connect(fn)
  443.             except socket.error:
  444.                 maybes
  445.                 maybes
  446.                 
  447.                 try:
  448.                     os.unlink(fn)
  449.                 except IOError:
  450.                     pass
  451.                 except:
  452.                     None<EXCEPTION MATCH>IOError
  453.                 
  454.  
  455.                 None<EXCEPTION MATCH>IOError
  456.  
  457.             return s
  458.         
  459.  
  460.     
  461.     def _remote(self, action):
  462.         s = self._find_grail_rc()
  463.         if not s:
  464.             return 0
  465.         s.send(action)
  466.         s.close()
  467.         return 1
  468.  
  469.     
  470.     def open(self, url, new = 0, autoraise = 1):
  471.         if new:
  472.             ok = self._remote('LOADNEW ' + url)
  473.         else:
  474.             ok = self._remote('LOAD ' + url)
  475.         return ok
  476.  
  477.  
  478.  
  479. def register_X_browsers():
  480.     if 'GNOME_DESKTOP_SESSION_ID' in os.environ and _iscommand('gnome-open'):
  481.         register('gnome-open', None, BackgroundBrowser('gnome-open'))
  482.     
  483.     if 'KDE_FULL_SESSION' in os.environ and _iscommand('kfmclient'):
  484.         register('kfmclient', Konqueror, Konqueror('kfmclient'))
  485.     
  486.     if _iscommand('x-www-browser'):
  487.         register('x-www-browser', None, BackgroundBrowser('x-www-browser'))
  488.     
  489.     for browser in ('mozilla-firefox', 'firefox', 'mozilla-firebird', 'firebird', 'iceweasel', 'iceape', 'seamonkey', 'mozilla', 'netscape'):
  490.         if _iscommand(browser):
  491.             register(browser, None, Mozilla(browser))
  492.             continue
  493.     
  494.     if _iscommand('kfm'):
  495.         register('kfm', Konqueror, Konqueror('kfm'))
  496.     elif _iscommand('konqueror'):
  497.         register('konqueror', Konqueror, Konqueror('konqueror'))
  498.     
  499.     for browser in ('galeon', 'epiphany'):
  500.         if _iscommand(browser):
  501.             register(browser, None, Galeon(browser))
  502.             continue
  503.     
  504.     if _iscommand('skipstone'):
  505.         register('skipstone', None, BackgroundBrowser('skipstone'))
  506.     
  507.     if _iscommand('opera'):
  508.         register('opera', None, Opera('opera'))
  509.     
  510.     if _iscommand('mosaic'):
  511.         register('mosaic', None, BackgroundBrowser('mosaic'))
  512.     
  513.     if _iscommand('grail'):
  514.         register('grail', Grail, None)
  515.     
  516.  
  517. if os.environ.get('DISPLAY'):
  518.     register_X_browsers()
  519.  
  520. if os.environ.get('TERM'):
  521.     if _iscommand('www-browser'):
  522.         register('www-browser', None, GenericBrowser('www-browser'))
  523.     
  524.     if _iscommand('links'):
  525.         register('links', None, GenericBrowser('links'))
  526.     
  527.     if _iscommand('elinks'):
  528.         register('elinks', None, Elinks('elinks'))
  529.     
  530.     if _iscommand('lynx'):
  531.         register('lynx', None, GenericBrowser('lynx'))
  532.     
  533.     if _iscommand('w3m'):
  534.         register('w3m', None, GenericBrowser('w3m'))
  535.     
  536.  
  537. if sys.platform[:3] == 'win':
  538.     
  539.     class WindowsDefault(BaseBrowser):
  540.         
  541.         def open(self, url, new = 0, autoraise = 1):
  542.             
  543.             try:
  544.                 os.startfile(url)
  545.             except WindowsError:
  546.                 return False
  547.  
  548.             return True
  549.  
  550.  
  551.     _tryorder = []
  552.     _browsers = { }
  553.     register('windows-default', WindowsDefault)
  554.     iexplore = os.path.join(os.environ.get('PROGRAMFILES', 'C:\\Program Files'), 'Internet Explorer\\IEXPLORE.EXE')
  555.     for browser in ('firefox', 'firebird', 'seamonkey', 'mozilla', 'netscape', 'opera', iexplore):
  556.         if _iscommand(browser):
  557.             register(browser, None, BackgroundBrowser(browser))
  558.             continue
  559.     
  560.  
  561.  
  562. try:
  563.     import ic
  564. except ImportError:
  565.     pass
  566.  
  567.  
  568. class InternetConfig(BaseBrowser):
  569.     
  570.     def open(self, url, new = 0, autoraise = 1):
  571.         ic.launchurl(url)
  572.         return True
  573.  
  574.  
  575. register('internet-config', InternetConfig, update_tryorder = -1)
  576. if sys.platform == 'darwin':
  577.     
  578.     class MacOSX(BaseBrowser):
  579.         '''Launcher class for Aqua browsers on Mac OS X
  580.  
  581.         Optionally specify a browser name on instantiation.  Note that this
  582.         will not work for Aqua browsers if the user has moved the application
  583.         package after installation.
  584.  
  585.         If no browser is specified, the default browser, as specified in the
  586.         Internet System Preferences panel, will be used.
  587.         '''
  588.         
  589.         def __init__(self, name):
  590.             self.name = name
  591.  
  592.         
  593.         def open(self, url, new = 0, autoraise = 1):
  594.             if not "'" not in url:
  595.                 raise AssertionError
  596.             if ':' not in url:
  597.                 url = 'file:' + url
  598.             
  599.             new = int(bool(new))
  600.             if self.name == 'default':
  601.                 script = 'open location "%s"' % url.replace('"', '%22')
  602.             elif self.name == 'OmniWeb':
  603.                 toWindow = ''
  604.             else:
  605.                 toWindow = 'toWindow %d' % (new - 1)
  606.             cmd = 'OpenURL "%s"' % url.replace('"', '%22')
  607.             script = 'tell application "%s"\n                                activate\n                                %s %s\n                            end tell' % (self.name, cmd, toWindow)
  608.             osapipe = os.popen('osascript', 'w')
  609.             if osapipe is None:
  610.                 return False
  611.             osapipe.write(script)
  612.             rc = osapipe.close()
  613.             return not rc
  614.  
  615.  
  616.     register('MacOSX', None, MacOSX('default'), -1)
  617.  
  618. if sys.platform[:3] == 'os2' and _iscommand('netscape'):
  619.     _tryorder = []
  620.     _browsers = { }
  621.     register('os2netscape', None, GenericBrowser([
  622.         'start',
  623.         'netscape',
  624.         '%s']), -1)
  625.  
  626. if 'BROWSER' in os.environ:
  627.     _userchoices = os.environ['BROWSER'].split(os.pathsep)
  628.     _userchoices.reverse()
  629.     for cmdline in _userchoices:
  630.         if cmdline != '':
  631.             _synthesize(cmdline, -1)
  632.             continue
  633.     
  634.     cmdline = None
  635.     del cmdline
  636.     del _userchoices
  637.  
  638.  
  639. def main():
  640.     import getopt as getopt
  641.     usage = 'Usage: %s [-n | -t] url\n    -n: open new window\n    -t: open new tab' % sys.argv[0]
  642.     
  643.     try:
  644.         (opts, args) = getopt.getopt(sys.argv[1:], 'ntd')
  645.     except getopt.error:
  646.         msg = None
  647.         print >>sys.stderr, msg
  648.         print >>sys.stderr, usage
  649.         sys.exit(1)
  650.  
  651.     new_win = 0
  652.     for o, a in opts:
  653.         if o == '-n':
  654.             new_win = 1
  655.             continue
  656.         if o == '-t':
  657.             new_win = 2
  658.             continue
  659.     
  660.     if len(args) != 1:
  661.         print >>sys.stderr, usage
  662.         sys.exit(1)
  663.     
  664.     url = args[0]
  665.     open(url, new_win)
  666.     print '\x07'
  667.  
  668. if __name__ == '__main__':
  669.     main()
  670.  
  671.